#pragma once 


template <typename E,int M>
struct SqQueue
{
    E elem[M];
    int front,rear;
};
//初始化队列
template <typename E,int M>
void InitQueue(SqQueue<E,M> &Q)
{
    Q.front=Q.rear=0;
}
//判断是否为空
template <typename E,int M>
bool QueueEmpty(const  SqQueue<E,M> &Q)
{
    return Q.front==Q.rear;
}
//入队
template <typename E,int M>
void EnQueue(SqQueue<E,M> &Q, E e)
{
    if ((Q.rear+1) % M == Q.front) throw "queue full";

    Q.elem[Q.rear]=e;
    Q.rear=(Q.rear+1) % M; 
}
//出队列
template <typename E,int M>
void DeQueue(SqQueue<E,M> &Q, E &e)
{
    if(Q.front==Q.rear) throw "Queue empty";
     
    e=Q.elem[Q.front];
    Q.front=(Q.front+1) %M;
}

//得到头元素
template <typename E,int M>
void GetHead(const SqQueue<E,M> &Q,E &e)
{
    if(Q.front==Q.reaer) throw "Queue empty";
    e=Q.elem[Q.front];
}